﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Web.UI;
using System.Web.UI.WebControls;
using ClickLand.CorporacionPlaza.Presentacion.Contratos.AdministracionVentas;
using ClickLand.CorporacionPlaza.Presentacion.CorporacionPlazaWS;
using ClickLand.CorporacionPlaza.Presentacion.Presentadores.AdministracionVenta;
using Resources;

namespace AdministracionVentas
{
    /// <summary>
    /// Code behind de la vista que se encarga de consultar las ventas
    /// </summary>
    public partial class ConsultarVentas : Page, IConsultarVentas
    {
        #region Atributos

        /// <summary> Objeto que posee la definicion del presentador de la vista </summary>
        private PresentadorConsultarVentas _presentador;

        #endregion

        #region Eventos


        /// <summary>Evento de inicializacion de la página.</summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void Page_Init(object sender, EventArgs e)
        {
            _presentador = new PresentadorConsultarVentas(this);
        }


        /// <summary>Evento de inicializacion de la página.</summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if(!IsPostBack)
                _presentador.CargarPagina();
            mvConsultarVenta.SetActiveView(vConsultarVenta);
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de buscar ventas </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnBuscarVentaCLick(object sender, EventArgs e)
        {
            Page.Validate();
            if (Page.IsValid)
            {
                _presentador.BuscarVentas();
                lblTituloReporte.Text = "Ventas del mes " + FechaInicio.ToString("MMMM yyyy");
                mvConsultarVenta.SetActiveView(vListaVentas);
                ConfigurarControles();
            }
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton siguiente en la paginacion de la lista de ventas </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnAnteriorPaginacionOnClick(object sender, EventArgs e)
        {
            if (gvListaVentas.PageIndex > 0)
                gvListaVentas.PageIndex--;
            gvListaVentas.DataSource = ListaVentas;
            gvListaVentas.DataBind();

            ConfigurarControles();
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton siguiente en la paginacion de la lista de ventas </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnSiguientePaginacionOnClick(object sender, EventArgs e)
        {

            if (gvListaVentas.PageIndex < gvListaVentas.PageCount)
                gvListaVentas.PageIndex++;

            gvListaVentas.DataSource = ListaVentas;
            gvListaVentas.DataBind();
            ConfigurarControles();
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton regresar en la vista de la lista deventas </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnRegresarListaCLick(object sender, EventArgs e)
        {
            mvConsultarVenta.SetActiveView(vConsultarVenta);
        }


        /// <summary> Evento del boton que realiza la accion de imprimir el reporte </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnImprimirClick(object sender, EventArgs e)
        {
            Response.ClearContent();
            Response.ClearHeaders();
            Response.ContentType = "application/pdf";
            Response.AddHeader("Content-Disposition", "attachment; filename=" + "ReporteVentaMes.pdf");
            Response.TransmitFile(ConfigurationManager.AppSettings["RutaDescarga"] + "ReporteVentaMes.pdf");
            Response.End();
            Response.Flush();
            Response.Clear();
        }


        /// <summary> Metodo que se ejecuta cuando se da click al boton de generar PDF </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnGenerarPdfClick(object sender, EventArgs e)
        {
            _presentador.ImprimirReporte();
            myPDF.Attributes["src"] = ConfigurationManager.AppSettings["RutaDescargaOnLine"] + "ReporteVentaMes.pdf";
            mvConsultarVenta.SetActiveView(vReporte);
        }


        /// <summary> Metodo que ejecuta la acccion del boton regresar de la vista de visualizacion de reporte </summary>
        /// <param name="sender">Objeto que generó el evento.</param>
        /// <param name="e">Argumento del evento.</param>
        protected void BtnRegresarReporte(object sender, EventArgs e)
        {
            mvConsultarVenta.SetActiveView(vListaVentas);
        }


        /// <summary> Validador que valida la fecha ingresada por el usuairo </summary>
        /// <param name="source">objeto fuente del validador</param>
        /// <param name="args">argumento del evento</param>
        protected void ValidarFecha(object source, ServerValidateEventArgs args)
        {
            if (!string.IsNullOrEmpty(fechas.Fecha))
            {
                DateTime fechaInicio = new DateTime(FechaFin.Year, FechaFin.Month, 1);
                DateTime fechaHoy = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
                args.IsValid = fechaInicio <= fechaHoy;
            }
            else
                args.IsValid = false;
        }
        #endregion

        #region Propiedades

        /// <summary> Propiedad que obtiene la fecha de inicio de la consulta </summary>
        public DateTime FechaInicio
        {
            get { return Convert.ToDateTime(fechas.Fecha); }
        }


        /// <summary> Propiedad que obtiene la fecha fin de la consulta </summary>
        public DateTime FechaFin
        {
            get { return Convert.ToDateTime(fechas.Fecha).AddMonths(1).AddDays(-1); }
        }
        

        /// <summary> Propiedad que setea la lista de contratos activos pertenecientes a la feria</summary>
        public List<ContratoDto> ListaContratos
        {
            get { return (List<ContratoDto>) Session["ListaContratos"]; }
            set
            {
                Session["ListaContratos"] = value;
                ddlContratos.DataSource = value;
                ddlContratos.DataTextField = "RazonSocial";
                ddlContratos.DataValueField = "Id";
                ddlContratos.DataBind();
            }
        }
        

        /// <summary> Propiedad que obtiene el contrato seleccionado </summary>
        public ContratoDto ContratoSeleccionado
        {
            get
            {
                var lista = (List<ContratoDto>)Session["ListaContratos"];
                return (ddlContratos.SelectedIndex == 0)? null : lista[ddlContratos.SelectedIndex -1];
            }
        }


        /// <summary> Propiedad que obtiene o setea el valor de la lista de las ventas que cumple con la consutla </summary>
        public List<VentaDto> ListaVentas
        {
            get { return (List<VentaDto>) Session["ListaVentas"]; }
            set
            {
                Session["ListaVentas"] = value;
                gvListaVentas.DataSource = value;
                gvListaVentas.DataBind();
            }
        }

        public string TipoConsulta
        {
            get
            {
                return "mes";
            }
        }

        public string TituloReporte
        {
            get { return Etiquetas.TitulosReporteVentaMes; }
        }

        #endregion

        #region Metodos

        /// <summary> Metodo que realiza las operaciones para configurar la visibilidad de los botones
        /// y el texto de información </summary>
        private void ConfigurarControles()
        {
            lblInfoPaginado.Visible = gvListaVentas.PageCount >= 1;
            lblInfoPaginado.Text = string.Format("Página {0}/{1} - Total Registros {2}",
                gvListaVentas.PageIndex + 1, gvListaVentas.PageCount,
                ((List<VentaDto>)gvListaVentas.DataSource).Count);
            btnAnteriorPag.Visible = (gvListaVentas.PageIndex > 0);
            btnSiguientePag.Visible = (gvListaVentas.PageIndex < gvListaVentas.PageCount - 1) &&
                             (gvListaVentas.PageCount > 1);
            lblSinCliente.Visible = gvListaVentas.Rows.Count == 0;
            btnImprimir.Visible = gvListaVentas.Rows.Count != 0;
        }

        #endregion

    }
}